#pragma once

#include <nanobdd/bdd.h>

#define PAIR(a, b) \
  ((unsigned int)((((unsigned int)a) + ((unsigned int)b)) * (((unsigned int)a) + ((unsigned int)b) + ((unsigned int)1)) / ((unsigned int)2) + ((unsigned int)a)))
#define PAIRp(a, b) \
  ((uint64_t)((((uint64_t)a) + ((uint64_t)b)) * (((uint64_t)a) + ((uint64_t)b) + ((uint64_t)1)) / ((uint64_t)2) + ((uint64_t)a)))
#define TRIPLE(a, b, c) ((unsigned int)(PAIR((unsigned int)c, PAIR(a, b))))
#define TRIPLEp(a, b, c) ((unsigned int)(PAIRp((uint64_t)c, PAIRp(a, b))))

namespace nanobdd {

// extern std::shared_ptr<Node> trueNode;
// extern std::shared_ptr<Node> falseNode;

}